-- 协同程序测试 coroutine

--[[
    coroutine.create() 创建一个协同程序，返回coroutine，参数是一个函数
    coroutine.resume() 重启coroutine
    coroutine.yield() 将coroutine设置为挂起状态
    coroutine.status() 获取coroutine状态- dead、suspended、running
    coroutine.warp() 创建coroutine,返回一个函数，一旦调用这个函数，进入coroutine
    coroutine.running() 返回正在running的coroutine
--]]
co =
    coroutine.create(
    function(i)
        print(i)
        print(coroutine.status(co))
    end
)

print(coroutine.status(co))
coroutine.resume(co, 1)
print(coroutine.status(co))

print("----------------------")

co = coroutine.wrap(function(i)
    print(i)
end)

co(1)

print("----------------------")

co = coroutine.create(function ()
    for i = 1, 10 do
        print(i)
        coroutine.yield()
    end
end)

coroutine.resume(co)
coroutine.resume(co)

print(coroutine.status(co))


-- 生产者消费者问题
local newProductor

-- 生产者，每次生产一个i + 1， 然后返回
function productor()
    local i = 0
    while true do
        i = i + 1
        send(i)
    end
end

-- 消费者，每次接收一个i+1消费
function consumer()
    while true do
        local i = receive() --从生产者那里获得i
        print(i)
    end
end

function send(i)
    coroutine.yield(i) -- 发送完以后yield挂起等待下次发送
end

function receive()
    local status, i = coroutine.resume(newProductor)
    return value
end

newProductor = coroutine.create(productor)
consumer()